import * as Router from 'koa-router';
import * as fs from 'fs';
import { getRepository, Repository } from "typeorm";
// import * as jwt from 'jsonwebtoken';
import { JWT } from '../utils/jwt';
import { config } from '../config/config';
import { User } from "../database/entity/user";
const router = new Router({
    prefix:'/api'
});
const jwtfunc = new JWT();

const _ReqWithoutAuthArr: Array<string> = ["/api/login","/api/users","/api/logout"];

router.use("*", async (ctx, next) => {
    try{
        if(_ReqWithoutAuthArr.indexOf(ctx.originalUrl.split("?")[0]) >= 0)
            await next();
        else {
            const token: string = ctx.header.authorization.split(' ')[1];
            const secret: string = config.jwtSecret;
            let decode = await jwtfunc.verify({
                token,
                secret,
            })
            if(decode) {
                const name: string = decode.name;
                const userRepository: Repository<User> = getRepository(User);
                const user: User = await userRepository.findOne({
                    name,
                });
                if(Date.now() <= decode.exp) {
                    if(user.token === token) {
                        await next();
                    }else {
                        console.log("token expired");
                        ctx.status = 200;
                        ctx.app.emit('error', {
                            code: ctx.ERROR.ERRORCODE_USEREXPIRED,
                            message: ctx.ERROR.ERRORMSG_USEREXPIRED
                        }, ctx);
                    }
                }else {
                    console.log("date expired");
                    ctx.status = 500;
                    ctx.app.emit('error', {
                        code: ctx.ERROR.ERRORCODE_USEREXPIRED,
                        message: ctx.ERROR.ERRORMSG_USEREXPIRED
                    }, ctx);
                }
            }else {
                ctx.status = 200;
                ctx.app.emit('error', {
                    code: ctx.ERROR.ERRORCODE_USERUNLOGIN,
                    message: ctx.ERROR.ERRORMSG_USERUNLOGIN
                }, ctx);
            }
        }
    }catch(err){
        ctx.response.status = err.statusCode || err.status || 500;
        const msg: string = err.message ? err.message : ctx.ERROR.ERRORMSG_SYSTEMERROR;
        const code: number = err.errno ? err.errno : ctx.ERROR.ERRORCODE_SYSTEMERROR;
        ctx.response.body = ctx.util.response(code,msg);
    }
})

// 其他页面通过 router 加载
/**
 * 这边有一个问题，本来我在debug中是采用ts-node进行开发调试的，但是这里就出现一个问题，就是我在读取文件的时候，开发时没问题但是一旦我使用 yarn start，就报错了。
 * 错误原因是module.routes()不存在，调试发现，开发时跟正式启动时读取的文件夹不一样。。。就是说  我用--exec ts-node ./src/server.ts 这时候并不编译ts，而是直接在ts上调试，但是一旦挪到生产环境，读取的是dist文件夹，调试时读取的直接是src文件夹。所以为保持一致，全部采用tsc不在采用ts-node。
 */

let urls = fs.readdirSync(`${__dirname}/api`);

urls.forEach( element => {

    let base = element.split('.');

    if(base[2] && base[2] === 'map') return ;

    let module = require(`${__dirname}/api/${element}`);

    /*
      urls 下面的每个文件负责一个特定的功能，分开管理
      通过 fs.readdirSync 读取 urls 目录下的所有文件名，挂载到 router 上面
    */
    let name = element.split('.')[0];

    router.use(module[name].routes(),router.allowedMethods());
})

export { router };